// Package app 需要注册的后台服务
package app

import (
	"context"
	"github.com/sirupsen/logrus"
	"golang.org/x/sync/errgroup"
	"vap_host/daemon/session_notifications"
	"vap_host/daemon/tcp"
	"vap_host/global"
)

type Daemon struct {
	exitFunc context.CancelFunc
}

func NewDaemon() *Daemon {
	return &Daemon{}
}

// Run runs the service and blocks until complete.
func (d *Daemon) Run(parentCtx context.Context) {
	var (
		g   errgroup.Group
		err error
	)
	ctx, cancelFunc := context.WithCancel(parentCtx)
	d.exitFunc = cancelFunc

	// 初始化数据库连接
	global.InitDB()
	// 初始化tcp连接
	tcp.InitConnection()

	// 监听 win 会话状态变化
	g.Go(func() error {
		defer func() {
			logrus.Errorf("监听 win 会话状态变化时发生错误：%s", err)
		}()
		err = session_notifications.Call(ctx, tcp.ClientConn)
		logrus.Errorf("session_notifications.Call err: %v", err)
		return err
	})

	g.Go(func() error {
		defer func() {
			logrus.Debug("优雅关闭,协程-已退出")
			cancelFunc()
		}()
		<-ctx.Done()
		return nil //nolint
	})

	err = g.Wait()
	if err != nil {
		logrus.Debugf("shutting down the server: %v", err)
	}

}
